/*
Driver.java
Autor: Paola Garcia, carnet 10205
Fecha: 20 agosto 2011
Descripcion: clase principal para realizar todas las operaciones
*/

import java.util.InputMismatchException;
import java.util.Scanner;

//Principal
public class Driver{
	public static void main( String[] args){
	
	//Declaracion de objetos
		
	Scanner leer = new Scanner(System.in);
	Pila<Double> obj = new Pila<Double>();
	
	//Declaracion de variables
	
	int seleccion, seleccion2, tecl;
	double uno, dos, num;
	double resp = 0;
	
		do{
			
			menu();
			
			//Agarrar seleccion
			seleccion = (int)obtenerNumero("Seleccione una opcion: ", false);
			
			switch(seleccion){
				case 1:
					instr();
					do{
						tecl = (int)obtenerNumero("Ingrese el numero 1 para salir: " , false);	
					}while(tecl != 1);
					break;
				case 2: //Ingresar un dato
						do{
							subMenu();
							seleccion2 = (int)obtenerNumero("Seleccione una opcion: ", false);
							switch(seleccion2){
								case 1: //Numero
									System.out.println("\n Ingresando numero \n");
									num = leer.nextDouble();
									obj.push(num);
									leer.nextLine();	
									break;
								case 2: //Sumar
									System.out.println("\n Sumando \n");
									uno = obj.pop(); //saca el primer numero ingresado
									dos = obj.pop(); //saca el siguiente
									resp = obj.sum(uno, dos);
									obj.empty();
									obj.push(resp);
									System.out.println("\n Resultado:" + resp + "\n");
									break;
								case 3: //Restar
									System.out.println("\n Restando \n");
									uno = obj.pop(); //saca el primer numero ingresado
									dos = obj.pop(); //saca el siguiente
									resp = obj.rest(uno, dos);
									obj.empty();
									obj.push(resp);
									System.out.println("\n Resultado:" + resp + "\n");
									break;
								case 4: //Multiplicar
									System.out.println("\n Multiplicando \n");
									dos = obj.pop(); //saca el primer numero ingresado
									uno = obj.pop(); //saca el siguiente
									resp = obj.mul(uno, dos);
									obj.empty();
									obj.push(resp);
									System.out.println("\n Resultado:" + resp + "\n");
							
									break;
								case 5: //Dividir
									System.out.println("\n Dividiendo \n");
									dos = obj.pop(); //saca el primer numero ingresado
									uno = obj.pop(); //saca el siguiente
									resp = obj.div(uno, dos);
									obj.empty();
									obj.push(resp);
									System.out.println("\n Resultado:" + resp + "\n");
	
									break;
								case 6:
									break;
							}
						}while(seleccion2 != 6);
						break;
				case 3: //Salir del programa
					System.out.println("\n FELIZ DIA \n");
					break;	
			}
			
		}while(seleccion != 3);
	 
	}
	
	
	//Se crea el menu de opciones
		public static void menu(){
			System.out.println(); 
	        System.out.println("+--       MENU DE OPCIONES       --+");
			System.out.println("| 1. Instrucciones.                |");
	        System.out.println("| 2. Ingresar numero u operando.   |");
	        System.out.println("| 3. Salir.                        |");
	        System.out.println("+----------------------------------+");
			
		}
		
		public static void instr(){
		System.out.println(); 
		System.out.println("+--     INSTRUCCIONES     --+");
		System.out.println("--> Debe tener cuidado que al realizar");
		System.out.println(" cualquier operacion, debe ingresar: ");
		System.out.println("1. Al inicio dos numeros");
		System.out.println("2. Antes de cada siguiente operacion ingresar");
		System.out.println(" un valor para que pueda realizar la operacion.");
		System.out.println(); 
		}
		
		public static void subMenu(){
			System.out.println(); 
	        System.out.println("+-- SUBMENU DE OPCIONES --+");
	        System.out.println("| 1. Numero.              |");
	        System.out.println("| 2. Suma.                |");
			System.out.println("| 3. Resta.               |");
			System.out.println("| 4. Multiplicacion.      |");
			System.out.println("| 5. Division.            |");
			System.out.println("| 6. Salir del submenu.   |");
	        System.out.println("+-------------------------+");
			
		}
		
		//Programacion defensiva que obtiene el valor ingresado por el usuario
		public static double obtenerNumero(String mensaje, boolean mostrar){
	        Scanner ingreso = new Scanner(System.in);
	        double numero = -1; //Se resta 1 para que sea el valor correcto
				System.out.print(mensaje);
				try{
					numero = ingreso.nextDouble();
				}
				catch(InputMismatchException exception){ //Atrapa la excepcion
					if (mostrar)
						System.out.println("\nHEY! ese dato es invalido. =] \n");
				}
				finally{
					ingreso.nextLine();//Agarrar enter
				}
				return numero;
	    }
}